package cn.tedu.client;

import cn.tedu.annotation.Component;

import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/*@Component      组件
@Controller     控制器
@Service        服务
@Repository     仓库DAO*/

public class ComponentScan {
    public static void main(String[] args) {
        // 创建一个Map集合，用于存储实例化的对象
        Map<String, Object> beanMap = new HashMap<>();

        // 目前只知道一个包的名字，当这个类上有@Commponent注解的时候，实例化该对象，然后放到map集合中。
        String packageName = "cn.tedu.bean";

        // 开始写扫描程序
        // 将包名转换为路径名，以便后续加载资源
        String packagePath = packageName.replaceAll("\\.", "/");
        System.out.println(packagePath);

        // 获取包对应的资源路径
        URL url = ClassLoader.getSystemClassLoader().getResource(packagePath);
        String path = url.getPath();
        System.out.println(path);

        // 创建File对象，用于遍历包下的所有类文件
        File file = new File(path);
        File[] files = file.listFiles();

        // 使用流API遍历文件数组，处理每个类文件
        Arrays.stream(files).forEach(file1 -> {
            System.out.println(file1.getName());
            System.out.println(file1.getName().split("\\.")[0]);

            try {
                // 构建类的全限定名
                String classname = packageName + "." + file1.getName().split("\\.")[0];
                System.out.println(classname);

                // 通过反射机制解析注解
                Class<?> clazz = Class.forName(classname);

                // 判断类上是否有这个注解
                if (clazz.isAnnotationPresent(Component.class)) {
                    Component annotation = clazz.getAnnotation(Component.class);
                    String id = annotation.value();

                    // 实例化对象并存入Map集合
                    Object obj = clazz.newInstance();
                    beanMap.put(id, obj);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        // 打印存储了实例化对象的Map集合
        System.out.println(beanMap);
    }
}